#ifndef _GPIO_LED_H_
#define _GPIO_LED_H_

// 包含必要的头文件
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "led.h"
#include <driver/gpio.h>
#include <driver/ledc.h>
#include <esp_timer.h>
#include <atomic>
#include <mutex>

// GPIO LED类
class GpioLed : public Led {
public:
    GpioLed(gpio_num_t gpio, int output_invert=0);  // 构造函数
    virtual ~GpioLed();  // 析构函数

    void OnStateChanged() override;  // 状态改变处理

private:
    std::mutex mutex_;  // 互斥锁
    TaskHandle_t blink_task_ = nullptr;  // 闪烁任务句柄
    ledc_channel_config_t ledc_channel_ = {0};  // LEDC通道配置
    bool ledc_initialized_ = false;  // LEDC初始化标志
    uint32_t duty_ = 0;  // PWM占空比
    int blink_counter_ = 0;  // 闪烁计数器
    int blink_interval_ms_ = 0;  // 闪烁间隔（毫秒）
    esp_timer_handle_t blink_timer_ = nullptr;  // 闪烁定时器句柄
    bool fade_up_ = true;  // 淡入淡出方向标志

    // 私有方法
    void StartBlinkTask(int times, int interval_ms);  // 启动闪烁任务
    void OnBlinkTimer();  // 闪烁定时器回调

    void BlinkOnce();  // 单次闪烁
    void Blink(int times, int interval_ms);  // 多次闪烁
    void StartContinuousBlink(int interval_ms);  // 连续闪烁
    void TurnOn();  // 打开LED
    void TurnOff();  // 关闭LED
    void SetBrightness(uint8_t brightness);  // 设置亮度
    void StartFadeTask();  // 启动淡入淡出任务
    void OnFadeEnd();  // 淡入淡出结束回调
    static bool FadeCallback(const ledc_cb_param_t *param, void *user_arg);  // 淡入淡出回调函数
};

#endif // _GPIO_LED_H_
